package com.ungs.dao.impl;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import com.ungs.dao.ProcesoDAO;
import com.ungs.entities.Proceso;
import com.ungs.utils.Constantes;

public class ProcesoDAOImpl extends EntidadDAOImpl<Proceso> implements
		ProcesoDAO {

	@SuppressWarnings("unchecked")
	@Override
	public List<Proceso> getProcesosOrdenados(boolean todos)
			throws HibernateException {
		List<Proceso> procesoList = new ArrayList<Proceso>();

		logger.info("Obteniendo la lista de procesos ordenados");
		try {
			iniciaConexion();
			Criteria criteria = getSession().createCriteria(Proceso.class);
			if (!todos) {
				criteria.add(Restrictions.eq("estadoLogico", Constantes.ALTA));
			}
			criteria.addOrder(Order.asc("orden"));

			procesoList = (List<Proceso>) criteria.list();

		} catch (HibernateException he) {
			logger.error("Error al traer los procesos ordenados: " + Proceso.class
					+ "DAO");
			manejaExcepcion(he);
			throw he;
		} finally {
			getSession().close();
		}
		return procesoList;
	}

	@SuppressWarnings("unchecked")
	@Override
	public Proceso getUltimoProceso() throws HibernateException {
		Proceso proceso = null;
		List<Proceso> procesoList = new ArrayList<Proceso>();

		logger.info("Obteniendo el ultimo proceso");
		try {
			iniciaConexion();
			Criteria criteria = getSession().createCriteria(Proceso.class);
			criteria.setMaxResults(1);
			criteria.addOrder(Order.desc("id"));

			procesoList = (List<Proceso>) criteria.list();

			if (procesoList.size() > 0)
				proceso = procesoList.get(0);

		} catch (HibernateException he) {
			logger.error("Error al traer el ultimo proceso: " + Proceso.class
					+ "DAO");
			manejaExcepcion(he);
			throw he;
		} finally {
			getSession().close();
		}

		return proceso;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Proceso> getProcesoByFilter(String param, boolean todos)
			throws HibernateException {
		List<Proceso> procesoList = new ArrayList<Proceso>();

		logger.info("Obteniendo la lista de procesos por descripcion");
		try {
			iniciaConexion();
			Criteria criteria = getSession().createCriteria(Proceso.class);
			criteria.add(Restrictions.like("descripcion", param + "%"));
			if (!todos) {
				criteria.add(Restrictions.eq("estadoLogico", "A"));
			}

			procesoList = criteria.list();

		} catch (HibernateException he) {
			logger.error("Error al traer el filtro de proceso: "
					+ Proceso.class + "DAO");
			manejaExcepcion(he);
			throw he;
		} finally {
			getSession().close();
		}

		return procesoList;
	}

}
